package com.deer.wms.ware.task.service;

import com.deer.wms.intercept.common.data.CurrentUser;
import com.deer.wms.project.root.core.result.Result;
import com.deer.wms.project.root.service.SuperService;
import com.deer.wms.ware.task.model.SO.SoMaster;
import com.deer.wms.ware.task.model.SO.SoMasterCriteria;
import com.deer.wms.ware.task.model.out.OutDetail;
import com.deer.wms.ware.task.model.out.OutMaster;
import com.deer.wms.ware.task.model.out.OutMasterDto;
import com.deer.wms.ware.task.model.pickTask.PickTask;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;
import java.util.Set;

/**
 * <p>
 * 发运单master 服务类
 * </p>
 *
 * @author luowei
 * @since 2022-04-18 17:42:23
 */
public interface OutMasterService extends SuperService<OutMaster> {
    /**
     * 按条件查询
     * @param criteria criteria
     * @return List<OutMasterDto>
     */
    List<OutMasterDto> findList(SoMasterCriteria criteria);

    /**
     * 根据已拣货任务生成出库单
     * @param soMaster 出库任务
     * @param outDetails 拣货任务
     * @param currentUser 操作人
     * @return 出库单号
     */
    String createOutBill(SoMaster soMaster, Set<OutDetail> outDetails, CurrentUser currentUser);

    /**
     * 根据拣货任务生成出库单
     * @param pickTask 拣货单
     * @param pickQty 拣货数量
     * @param currentUser 当前用户
     * @return 出库单号
     */
    String createOutBill(PickTask pickTask, double pickQty, CurrentUser currentUser);

    /**
     * 出库单确认
     * @param outMaster 出库单
     * @param currentUser 操作人
     */
    void confirmOutBill(OutMaster outMaster, CurrentUser currentUser);

    /**
     * 根据出库任务生成出库单
     * @param soMaster 出库任务
     * @param currentUser 操作人
     * @return 出库单号
     */
    String createOutBillBySoMaster(SoMaster soMaster, CurrentUser currentUser);

    /**
     * 到货签收
     * @param file 图片文件
     * @param outBillCode 出库单
     * @return
     */
    void signConfirm(MultipartFile file, String outBillCode) throws IOException;

    /**
     * 委外发料回传ERP
     * @param soMaster soMaster
     * @param supplierCode 供应商编码
     */
    void sendWeiWaiToErp(SoMaster soMaster, String supplierCode);

    /**
     * 生产领料回传ERP
     * @param soMaster soMaster
     */
    void sendShengChanToErp(SoMaster soMaster);

    /**
     * 杂发回传
     * @param soMaster
     */
    void sendZafaToErp(SoMaster soMaster);
}
